perm filename SCRHYX.F4[1,MUS] blob
sn#075936 filedate 1973-12-02 generic text, type T, neo UTF8
00010 C***** SUBRS RHYTH, SETUP,MARKS ********
00020
00100 SUBROUTINE RHYTH
00200 DIMENSION RPOS(2,40),R(8,100)
00300 COMMON /XRN/RN(4000)
00400 COMMON/SCM/V(78),I,LCNT,STAFF,LIST(200),REND
00500 COMMON /SCX/RHY(4),JALPHA(12),JX,JXX,JZ,IRHY,JD,KA,KB,IZ
00600 COMMON /STF/RSTFAC(8),RSTJC
00700 COMMON /SC/J,L,MK
00800 1 ,ISKP,XMINUS,N,IEXP,LK,NNUM,JJ,JA,DBST,NFLG,IXX,ISEMI,IQT
00900 1 ,VX(50),IAMP,K,KN,M,MODE,IBLA
01000 COMMON /POS/POS1,POS2
01100 EQUIVALENCE (RPOS(1,1),RN(3921)),(VX(1),X),(VX(2),Y),(VX(7)
01200 1,Z),(VX(3),AB),(VX(4),T),(VX(5),RB),(VX(6),X2),(SIZ,KN)
01300 1,(VX(8),C),(VX(9),S),(VX(10),X3),(SET4,RN(3920)),(RA,RN(3919))
01350 1,(R,RN(3001))
01400
01500 CC THIS IS NOW IN NOTES CALL SETUP
01600 NX=-1
01700 JX=0
01800 NOTE=0
01900 Y=0
02000 JSET=0
02100 C NEG. IF SETUP IS NOT READY
02200 IF(RPOS(1,1))GO TO 341
02250 KZ=1
02300 JSET=-1
02310 DO 9 KX=1,40
02320 9 IF(RPOS(2,KX).GT.0)GO TO 10
02400 10 AVGPOS=RPOS(1,KX)
02500 RLPOS=AVGPOS
02510 KX=KX+1
02600 RLP2=RPOS(1,KX)
02700 343 AVP2=RPOS(2,KX)-.001
02710 IF(AVP2.GT.0)GO TO 341
02720 KX=KX+1
02730 GO TO 343
02800 C AVERAGED AND REAL POSITIONS FROM 'SETUP'
03000 341 DO 34 K=1,IRHY
03100 34 IF(V(K).GT..05)Y=ABS(V(K))+Y
03150 C 99TH NOTES ARE TAKEN AS GRACE NOTES.
03200 C Y=TOTAL TIME
03300 Z=POS2-POS1
03400 ZX=Z
03410 IF(JSET)GO TO 3421
03500 342 DO 1 K=1,IZ
03600 X=R(1,K)
03700 IF(X.LT.3.)GO TO 1
03800 C JUMP IF NOTE OR REST
03900 IF(X.NE.7.)GO TO 8
04000 C JUMP IF NOT A KEY SIG.
04100 RA=2.+ABS(R(4,K))*2.0
04200 GO TO 6
04300 8 IF(X.NE.4.)GO TO 81
04400 C NEXT IS FOR BAR LINES
04500 RA=3.5
04600 RE=R(1,K+1)
04700 IF(RE.EQ.3.)RA=1.5
04800 C A CLEF
04900 IF(RE.EQ.18)RA=2.5
05000 C A METER
05100 C NEXT IS NOT A NOTE OR REST
05200 83 IF(K.EQ.IZ)RA=0
05300 C END OF STAFF
05400 GO TO 6
05500 82 RA=6
05600 GO TO 83
05700 81 IF(X.EQ.18)GO TO 82
05800 RA=8.
05900 C FOR CLEFS
06000 IF(K.LT.3)RA=10.
06100 C THE FIRST CLEF IS NOT MINI
06200 6 RA=RA*RSTJC
06300 C SO SPACE WILL DEPEND ON SIZE OF STAFF
06400 Z=Z-RA
06500 R(8,K)=RA
06600 C STORES SPACE NUM THAT MUST BE GIVEN BACK
06700 1 CONTINUE
06800 C SUBTRACTS SPACE FOR CLEF OR BAR. WILL ADD BOTH LATER.
06900 C POS1 AND Z ARE FOR RHYTHMIC SPACING
07000 CC ZZ=ZX-Z
07100 C SPACE FOR NON-NOTES
07150 134 FORMAT(' **** MISMATCH WITH STF.4 ****')
07200 3421 K=0
07250 IF(Y.NE.RA.AND.JSET)TYPE 134
07300
07400 C LOOP TO END
07500 3 K=K+1
07600 C K IS COUNTER
07610 R(6,K)=0
07620 R(7,K)=0
07700 RE=R(1,K)
07900 IF(RE.LE.2.)GO TO 2
08000 RD=R(8,K)
08100 R(8,K)=0
08300 IF(JSET)GO TO 71
08400 7 IF(K.EQ.IZ)POS1=POS2
08500 IF(R(1,K-1).GT.2..OR.K.EQ.1.OR.RE.EQ.4.)GO TO 73
08600 Z=Z+RD/3.
08700 C RETURNS 1/3 OF THE SPACE IF PREV. ITEM IS NOTE OR REST
08800 POS1=POS1-RD/3
08900 C THIS CAN RESULT IN OVERLAP WHICH MUST BE EDITED OUT.!!
09000 73 R(2,K)=POS1
09002 72 POS1=POS1+RD
09004 C ABOVE SECTION LEAVES ROOM FOR CLEF OR BAR
09006 GO TO 334
09010 71 DO 74 J=KZ,40
09012 74 IF(RE.EQ.-RPOS(2,J))GO TO 75
09014 POS=R(2,K-1)+4
09015 GO TO 76
09016 75 POS=RPOS(1,J)
09018 KZ=J+1
09020 C FOUND SAME TYPE OF ITEM.
09030 76 R(2,K)=POS
09040 GO TO 334
09500
09600 2 JX=JX+1
09700 21 AB=ABS(V(JX))
09710 IF(AB.GT..05)GO TO 210
09720 R(2,K)=-1.
09723 RA=100
09726 IF(R(4,K))RA=-RA
09730 R(4,K)=R(4,K)+RA
09740 R(7,K)=1.9
09742 C 1.9 IN P7 PUTS IN SLASH ON TAIL
09745 C FOUND A GRACE NOTE
09750 GO TO 334
09800 210 RB=0
09810 IF(JSET.GE.0.AND.SET4.LT.0)R(8,K)=-AB
09820 C FOR AUTOMATIC SETUP
09900 JZ=K
10000 C JZ WILL BE USED NEAR END
10100 3634 IF(AMOD(AB,.1875).EQ.0)GO TO 122
10200 C .1875 FINDS SINGLE DOTS ON NOTES
10210 IF(AMOD(AB,.4375).NE.0)GO TO 22
10220 T=2
10230 GO TO 322
10240 122 T=1
10300 322 IF(RE.EQ.2.)GO TO 35
10400 R(7,K)=R(7,K)+10.*T
10410 C PUTS ONE OR TWO DOTS
10500 C DOTS THE NOTE.
10600 GO TO 36
10700
10800 35 R(6,K)=T
10900 C ADDS DOT TO REST.
11000 36 RB=AB/3.
11010 IF(T.NE.1)RB=(4*AB)/7
11100 C TO KEEP TAIL ON DOTTED NOTE
11200
11400 22 POS=POS1
11500 IF(JSET.EQ.0)GO TO 220
11600 222 IF(NOTE)GO TO 223
11700 C FIRST TIME A NOTE IS FOUND.
11800 NOTE=-1
11900 POS1=RLPOS
12200 Z=POS2-POS1
12300 C RESETS SPACE AVAILABLE, ZZ IS SPACE FOR NON-NOTES
12400 223 IF(POS1.LT.AVP2)GO TO 221
12500 224 KX=KX+1
12510 C???? OCT, 73 IF(NX.EQ.0)GO TO 225
12600 CC AVGPOS=AVP2
12700 CC RLPOS=RLP2
12800 IF(NX)RLP2=RPOS(1,KX)
12900 NX=-1
12910 225 IF(RPOS(2,KX-1))GO TO 227
12955 RLPOS=RPOS(1,KX-1)
12977 AVGPOS=AVP2
12980 227 AVP2=RPOS(2,KX)-.001
13000 IF(AVP2.GT.0)GO TO 223
13100 C 0 IN RPOS=POS. OF NON-NOTE
13200 IF(RLP2.GE.POS1)NX=0
13300 GO TO 224
13400 221 POS=(POS1-AVGPOS)*(RLP2-RLPOS)/(AVP2-AVGPOS)+RLPOS
13500 CCC NX=-1
13600 220 R(2,K)=POS
13700 CC IF(RE.GT.2)GO TO 72
13800 4634 IF((AB.GE.2.OR.AB.EQ.1.333333333).AND.RE.EQ.1
13850 1 .AND.R(6,K).EQ.0)R(6,K)=-1.
13875 C 'WHITENS' HALF, WHOLE AND TRIPLET HALF NOTES.
13900 L=K+1
14000 2634 IF(R(8,L).GE.0.OR.R(1,L).NE.1.)GO TO 1634
14100 C JUMP IF NOT DOUBLE STOP
14200 IF(AB.GE.4)R(5,K)=AMOD(R(5,K),10.0)
14300 C DELETES STEM FROM WHOLE NOTE CHORD
14400 R(2,L)=R(2,K)
14500 K=L
14600 IF(R(6,K-1))R(6,K)=-R(6,K)
14700 R(8,K)=0
14800 GO TO 3634
14900 C LOOPS BACK TO PICK UP MORE CHORD NOTES
15000
15100 1634 T=POS1
15200 POS1=AB/Y*Z+POS1
15210 IF(JSET)GO TO 1636
15300 RP=6.
15400 IF(AMOD(R(5,K+1),10.0).EQ.0)RP=3.
15500 C 3 SPACES IF NO ACCID. ON NEXT NOTE, OTHERWISE 6.
15600 RA=POS1-T
15700 RSTX=RP*RSTJC
15800 IF(RA.GT.RSTX)GO TO 1636
15900 C JUMP IF NOTES ARE FAR ENOUGH APART
16000 RA=RSTX-RA
16100 C THE DIFFERENCE
16200 Z=Z-Z*RA/(POS2-POS1)
16300 C REDUCES TOTAL SIZE Z
16400 POS1=T+RSTX
16500 1636 T=0
16600 AB=AB-RB
16700 DO 534 N=1,4
16800 534 IF(AB.LE.RHY(N))T=N
16900 IF(AB.GE.4.)R(5,K)=AMOD(R(5,K),10.0)
17000 C DELETES STEM FROM WHOLE NOTES.
17100 R(7,JZ)=T+R(7,JZ)
17200 IF(R(1,JZ).EQ.1.)GO TO 334
17300 R(4,JZ)=0
17400 IF(AB.EQ.4.)T=-2.
17500 IF(AB.EQ.2.)T=-1.
17600 R(5,JZ)=T
17700 C OMITS RESTS (REALLY???)
17800 334 IF(K.LT.IZ)GO TO 3
17810 DO 335 K=IZ,1,-1
17820 IF(R(2,K).GE.0)GO TO 335
17825 IF(K.NE.IZ)GO TO 336
17827 R(2,K)=POS2-4.
17829 GO TO 335
17830 336 R(2,K)=R(2,K+1)-4.
17840 335 CONTINUE
17900 IF(JSET.OR.SET4.GE.0)RETURN
17905 M=IZ
17907 RA=-1
17910 DO 23 K=1,IZ
17915 M=M+1
17917 IF(R(2,K).NE.RA.AND.ABS(R(4,K)).LT.100)GO TO 123
17918 M=M-1
17919 GO TO 23
17920 123 RA=R(2,K)
17921 C TO CATCH DBL STOPS AND MINI-NOTES
17924 DO 323 L=1,8
17930 323 R(L,M)=R(L,K)
17935 R(3,M)=4
17945 R(8,K)=0
17960 23 CONTINUE
17970 IZ=M
17980 C ABOVE SETS UP STAFF 4 IF IT WASN'T ALREADY
17990 END
18000
18100 C SETUP ALLOWS YOU TO SET UP RHYTHMS ON STAFF 4 FOR SPACING ALL OTHERS.
18200 SUBROUTINE SETUP
18500 DIMENSION RPOS(2,40)
18600 COMMON/SCM/V(78),IV,LCNT,STAFF,LIST(200),REND
18700 COMMON /XRN/RN(4000)
18800 COMMON /PTR/PWDS(250),ITEM,L,I,IX
19100 EQUIVALENCE (RPOS(1,1),RN(3921)),(RA,RN(3919))
19200
19300 C ONLY DUPLE RHYTHMS MAY BE USED. SINGLE DOTS CAN BE USED.
19310 RPOS(1,1)=-1.
19320 IF(STAFF.EQ.4)RETURN
19400 JX=0
19600 RA=0
19700 DO 9534 K=1,ITEM
19800 L=PWDS(K)
20200 IF(RN(L+3).NE.4.)GO TO 9534
20400 RD=RN(L+1)
20450 IF(RD.EQ.10)GO TO 9534
20500 JX=JX+1
20600 RPOS(1,JX)=RN(L+2)
20700 IF(RD.GT.2)GO TO 3
20710 7 IF(RN(L+8))GO TO 177
20800 RB=0
20900 IF(RN(L+5).GE.10)GO TO 31
21000 RC=4.
21100 GO TO 131
21200 31 RB=RN(L+7)
21300 IF(RN(L+6).LT.0)GO TO 231
21400 RC=1./2**AMOD(RB,10.)
21500 GO TO 131
21600 231 RC=2.
21700 131 IF(RB.GT.9.)RC=RC*1.5
21710 277 RA=RA+RC
21720 C SUM OF RHYTHS
21800 GO TO 77
21810 177 RC=-RN(L+8)
21815 C FOR VALUES AUTOMATICALLY SET. ALLOWS NON-DUPLE UNITS IN SETUP
21820 GO TO 277
21900 3 RC=-RD
22000 77 RPOS(2,JX)=RC
22100 C RC IS RHYTHMIC VALUE OF NOTE.
22200 9534 CONTINUE
22300 C NEXT PUTS ITEMS IN PROPER ORDER IF THEY WEREN'T ALREADY
22400 IF(JX.EQ.0)RETURN
22500 CALL SORT2(RPOS,JX)
22510 DO 1 L=1,JX
22800 1 IF(RPOS(2,L).GT.0)GO TO 4
22910 4 RD=RPOS(1,L)
23000 RB=200-RD
23100 C TOTAL SPACE FROM 1ST NOTE TO END OF LINE
23150 RC=RPOS(2,L)
23200 RPOS(2,L)=RD
23300 C REAL AND AVERAGED POSITIONS OF 1ST NOTE ARE THE SAME.
23400 DO 2 K=L+1,JX
23450 RE=RPOS(2,K)
23460 IF(RE)GO TO 2
23490 RD=RC/RA*RB+RD
23492 RC=RE
23495 RPOS(2,K)=RD
23510 2 CONTINUE
23600 C 1,K=REAL POS. 2,K=AVERAGED POS.
23700 C IN RHYTH: POS=(P1-AVG2)*(RL2-RL1)/(AVG2-AVG1)+RL1
23800 JX=JX+1
23900 RPOS(1,JX)=200.
24000 RPOS(2,JX)=200
24100 END
34000 SUBROUTINE MARKS(RA)
34100 COMMON/ALF/INP(72),ML
34200 DIMENSION MKS(9)
34300 DATA MKS/'W','A','F','S','M','T','D','U','H'/
34400 EQUIVALENCE (M3,MKS(3)),(M9,MKS(9))
34500 RA=99
34600 DO 16 JM=1,72
34700 16 IF(INP(JM))GO TO 17
34800 C DIDN'T FIND MORE LETTERS
34900 RETURN
35000 17 N=INP(JM)
35100 ML=INP(JM+1)
35200 M=INP(JM+2)
35300 DO 1 K=1,9
35400 1 IF(N.EQ.MKS(K))GO TO 2
35500 C DID NOT FIND A LETTER
35600 RETURN
35700 2 GO TO(12,10,12,12,4,11,15,15,15),K
35800 15 K=K+1
35900 12 K=K+3
36000 8 RA=K
36100 C YOU CAN TYPE # OR NAME OF MARK
36200 DO 6 JM=1,72
36300 N=INP(JM)
36400 INP(JM)=' '
36500 C BLANKS OUT USED LETTERS
36600 6 IF(N.EQ.'/'.OR.N.EQ.'*'.OR.N.EQ.';')RETURN
36700 4 K=21
36800 IF(ML.NE.M3)GO TO 8
36900 18 K=K+1
37000 GO TO 8
37100 5 K=14
37200 GO TO 8
37300 10 IF(ML.EQ.'R')K=13
37400 C 'R' FOR ARSIS
37500 GO TO 12
37600 11 IF(ML.EQ.M9)K=12
37700 C THESIS
37800 GO TO 12
37900 END